Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>PureScript</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/PureScript"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-PureScript rootpage-PureScript skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">PureScript</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr"><p class="mw-empty-elt">
</p>
<table class="infobox_v2 infobox infobox--frwiki noarchive">
<tbody><tr>
<td colspan="2" class="entete informatique" style="background-color:#999999;color:black;"><span style="color: #fff;">PureScript</span><style data-mw-deduplicate="TemplateStyles:r228712691">
/* start https://fr.wikipedia.org/ */


.mw-parser-output .entete.informatique{background-image:url("./_mw_/Picto.nfo.png")}


/* end https://fr.wikipedia.org/ */
</style>
</td></tr>
<tr><td colspan="3" style="text-align:center; line-height: 1.5em;"> </td></tr>
<tr>

<td colspan="2"><hr style="height:2px; color:inherit; background-color:#999999;"></td></tr>
<tr>
<th scope="row">Date de première version
</th>
<td>2013
</td>
</tr>
<tr>

<th scope="row"><a href="Paradigme_(programmation)" title="Paradigme (programmation)">Paradigmes</a>
</th>
<td><a href="Programmation_fonctionnelle" title="Programmation fonctionnelle">fonctionnel</a>
</td>
</tr>
<tr>
<th scope="row">Auteur
</th>
<td>Phil Freeman
</td>
</tr>
<tr>



<th scope="row"><a href="Version_d'un_logiciel" title="Version d'un logiciel">Dernière version</a>
</th>
<td>0.15.15 (<time class="nowrap date-lien" datetime="2024-02-07" data-sort-value="2024-02-07"><a href="7_f%C3%A9vrier" title="7 février">7</a> <a href="F%C3%A9vrier_2024" title="Février 2024">février</a> <a href="2024_en_informatique" title="2024 en informatique">2024</a></time>)
</td>
</tr>
<tr>

<th scope="row">Typage
</th>
<td><a href="Typage_fort" title="Typage fort">Fort</a>, <a href="Typage_statique" title="Typage statique">statique</a>,<a href="Inf%C3%A9rence_de_types" title="Inférence de types">Inférence de type</a>
</td>
</tr>
<tr>


<th scope="row">Influencé par
</th>
<td><a href="Elm_(langage)" title="Elm (langage)">Elm</a>, <a href="F_Sharp" title="F Sharp">F#</a>, <a href="Haskell" title="Haskell">Haskell</a>, <a href="Koka" class="mw-redirect mw-disambig" title="Koka">Koka</a>, <a href="OCaml" title="OCaml">OCaml</a>, <a href="Roy" class="mw-disambig" title="Roy">Roy</a>, <a href="Standard_ML" title="Standard ML">Standard ML</a>
</td>
</tr>
<tr>





<th scope="row"><a href="Licence_de_logiciel" title="Licence de logiciel">Licence</a>
</th>
<td><a href="Licence_de_logiciel_permissive" title="Licence de logiciel permissive">Permissive</a> (<a href="Licence_BSD#Licence_BSD_Modifiée" title="Licence BSD">Licence_BSD_Modifiée</a>)<sup id="cite_ref-license_2-0" class="reference"><a href="#cite_note-license-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</td>
</tr>
<tr>
<th scope="row"><a href="Site_web" title="Site web">Site web</a>
</th>
<td><a rel="nofollow" class="external text" href="http://www.purescript.org">www.purescript.org</a>
</td>
</tr>
<tr>
<th scope="row"><a href="Extension_de_nom_de_fichier" title="Extension de nom de fichier">Extensions de fichiers</a>
</th>
<td>.purs
</td>
</tr>
<tr>

</tr>
</tbody></table>
<p><b>PureScript</b> est un <a href="Langage_de_programmation" title="Langage de programmation">langage de programmation</a> <a href="Programmation_fonctionnelle" title="Programmation fonctionnelle">fonctionnel</a> <a href="Typage_fort" title="Typage fort">fortement typé</a> dont la compilation produit du code <a href="JavaScript" title="JavaScript">JavaScript</a>. Il peut être utilisé pour développer des <a href="Application_web" title="Application web">applications web</a>, des applications serveur, et également des applications de bureau grâce au <a href="Framework" title="Framework">framework</a> <a href="Electron_(framework)" title="Electron (framework)">Electron</a>. Sa syntaxe est pour l'essentiel comparable à celle d'<a href="Haskell" title="Haskell">Haskell</a>. Cependant, le langage introduit un <a href="Polymorphisme_(informatique)#Polymorphisme_paramétré" title="Polymorphisme (informatique)">polymorphisme paramétré</a> particulier lié aux enregistrements extensibles<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>&nbsp;: les enregistrements polymorphes&nbsp;<a href="https://en.wikipedia.org/wiki/Row_polymorphism" class="extiw external" title="en:Row polymorphism"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Row_polymorphism&nbsp;»">(en)</span></a>. De plus, contrairement à Haskell, PureScript adhère à une <a href="Strat%C3%A9gie_d'%C3%A9valuation_(informatique)" title="Stratégie d'évaluation (informatique)">stratégie d'évaluation</a> stricte.
</p>

<div class="mw-heading mw-heading2"><h2 id="Historique">Historique</h2></div>
<p>PureScript fut initialement conçu par Phil Freeman en 2013. Celui-ci entama son travail sur PureScript après différentes tentatives insatisfaisantes de compilations d'Haskell vers JavaScript préservant sa sémantique (en utilisant par exemple Fay, Haste, ou GHCJS)<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>.
</p><p>Depuis, le projet a été repris par la communauté et est développé sur <a href="GitHub" title="GitHub">GitHub</a><sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>. Parmi les outils essentiels additionnels développés par la communauté, on peut citer l'outil dédié de compilation "Pulp"<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>, le site documentaire "Pursuit"<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>, et le gestionnaire de packages "Spago"<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Caractéristiques"><span id="Caract.C3.A9ristiques"></span>Caractéristiques</h2></div>
<p>PureScript se fonde sur l'<a href="%C3%89valuation_stricte" title="Évaluation stricte">évaluation stricte</a>, la <a href="Structure_de_donn%C3%A9es_persistante" title="Structure de données persistante">structure de données persistante</a> et l'<a href="Inf%C3%A9rence_de_types" title="Inférence de types">inférence de types</a>. Le <a href="Th%C3%A9orie_des_types" title="Théorie des types">système de types</a> de PureScript partage de nombreuses caractéristiques avec celui de langages fonctionnels similaires comme <a href="Haskell" title="Haskell">Haskell</a>: les <a href="Type_alg%C3%A9brique_de_donn%C3%A9es" title="Type algébrique de données">types algébriques de données</a> et le <a href="Filtrage_par_motif" title="Filtrage par motif">filtrage par motif</a>, les "higher kinded types"&nbsp;<a href="https://en.wikipedia.org/wiki/Type_class#Higher-kinded_polymorphism" class="extiw external" title="en:Type class"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Type_class#Higher-kinded_polymorphism&nbsp;»">(en)</span></a>, les "type classes"&nbsp;<a href="https://en.wikipedia.org/wiki/Type_class" class="extiw external" title="en:Type class"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Type class&nbsp;»">(en)</span></a> et les <a href="Type_d%C3%A9pendant" title="Type dépendant">dépendances fonctionnelles</a>, ainsi que le polymorphisme "higher-rank"&nbsp;<a href="https://en.wikipedia.org/wiki/Parametric_polymorphism#Rank-n_(&quot;higher-rank&quot;)_polymorphism" class="extiw external" title="en:Parametric polymorphism"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Parametric_polymorphism#Rank-n_(&quot;higher-rank&quot;)_polymorphism&nbsp;»">(en)</span></a>. Le système de types de PureScript assure également les enregistrements polymorphes&nbsp;<a href="https://en.wikipedia.org/wiki/Row_polymorphism" class="extiw external" title="en:Row polymorphism"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Row_polymorphism&nbsp;»">(en)</span></a> et les <a href="Hugs#Extensible_records" title="Hugs">enregistrements extensibles</a><sup id="cite_ref-docu_9-0" class="reference"><a href="#cite_note-docu-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>. Toutefois, PureScript ne possède pas certaines des caractéristiques les plus avancées d'Haskell comme les <a href="Type_alg%C3%A9brique_de_donn%C3%A9es#GADT" title="Type algébrique de données">GADT</a> et les "type families"&nbsp;<a href="https://en.wikipedia.org/wiki/Type_family" class="extiw external" title="en:Type family"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Type_family&nbsp;»">(en)</span></a>.
</p><p>Le <a href="Compilateur" title="Compilateur">compilateur</a> de PureScript tend à produire du code JavaScript lisible, autant que possible. Grâce à une simple interface "FFI"&nbsp;<a href="https://en.wikipedia.org/wiki/Foreign_function_interface" class="extiw external" title="en:Foreign function interface"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Foreign_function_interface&nbsp;»">(en)</span></a> il permet l'intégration de code JavaScript existant<sup id="cite_ref-docu_9-1" class="reference"><a href="#cite_note-docu-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>.
</p><p>PureScript assure la <a href="Compilation_incr%C3%A9mentale" title="Compilation incrémentale">compilation incrémentale</a>, et la distribution inclut un support au développement intéractif à partir de plugins à installer dans l'<a href="%C3%89diteur_de_texte" title="Éditeur de texte">éditeur de code source</a><sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>. Des plugins existent pour un grand nombre d'éditeurs connus incluant <a href="Vim" title="Vim">Vim</a>, <a href="Emacs" title="Emacs">Emacs</a>, <a href="Sublime_Text" title="Sublime Text">Sublime Text</a>, <a href="Atom_(%C3%A9diteur_de_texte)" title="Atom (éditeur de texte)">Atom</a> et <a href="Visual_Studio_Code" title="Visual Studio Code">Visual Studio Code</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Exemples_de_codes">Exemples de codes</h2></div><p>
Voici un programme <a href="Hello_World" class="mw-redirect" title="Hello World">"Hello world!"</a> minimal en PureScript:</p><div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="kr">module</span><span class="w"> </span><span class="nn">Main</span><span class="w"> </span><span class="kr">where</span>
<span class="linenos" data-line="2"></span>
<span class="linenos" data-line="3"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Effect.Console</span><span class="w"> </span><span class="p">(</span><span class="nf">log</span><span class="p">)</span>
<span class="linenos" data-line="4"></span>
<span class="linenos" data-line="5"></span><span class="nf">main</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="s">"Hello World!"</span>
</pre></div><p>
Ici, le type du programme est inféré et vérifié par le compilateur PureScript. Une version plus verbeuse du même programme pourrait explicitement inclure des annotations de type:</p><div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="kr">module</span><span class="w"> </span><span class="nn">Main</span><span class="w"> </span><span class="kr">where</span>
<span class="linenos" data-line="2"></span>
<span class="linenos" data-line="3"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Prelude</span>
<span class="linenos" data-line="4"></span>
<span class="linenos" data-line="5"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Effect</span><span class="w"> </span><span class="p">(</span><span class="kt">Effect</span><span class="p">)</span>
<span class="linenos" data-line="6"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Effect.Console</span><span class="w"> </span><span class="p">(</span><span class="nf">log</span><span class="p">)</span>
<span class="linenos" data-line="7"></span>
<span class="linenos" data-line="8"></span><span class="nf">main</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Effect</span><span class="w"> </span><span class="kt">Unit</span>
<span class="linenos" data-line="9"></span><span class="nf">main</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="s">"Hello World!"</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Enregistrements_en_PureScript">Enregistrements en PureScript</h3></div>
<p>Le modèle choisi pour développer les enregistrements en PureScript a permis l'accès à certaines fonctionnalités qui sont encore absentes d'Haskell<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>, ce qui fait de lui l'une des caractéristiques majeures du langage.
</p><p>En tout premier lieu, il faut préciser qu'en PureScript chaque enregistrement possède un type particulier réservé à cet usage, qui est lui-même présenté sous la forme d'un enregistrement composé par un ensemble (non ordonné) de couples `étiquette&nbsp;:: type`.
</p><p>Ainsi
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">carré</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">côté</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="p">,</span><span class="w"> </span><span class="n">aire</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="w"> </span><span class="p">}</span>
<span class="nf">carré</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">côté</span><span class="kt">:</span><span class="w"> </span><span class="mf">3.0</span><span class="p">,</span><span class="w"> </span><span class="n">aire</span><span class="kt">:</span><span class="w"> </span><span class="mf">9.0</span><span class="w"> </span><span class="p">}</span>
</pre></div>
<p>et
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">disque</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">rayon</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="p">,</span><span class="w"> </span><span class="n">aire</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="w"> </span><span class="p">}</span>
<span class="nf">disque</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">rayon</span><span class="kt">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="n">aire</span><span class="kt">:</span><span class="w"> </span><span class="mf">3.141592653589793</span><span class="w"> </span><span class="p">}</span>
</pre></div>
<p>sont deux enregistrements de types différents car, bien que le nombre et le type des valeurs sont les mêmes, les étiquettes ne le sont pas.
</p>
<div class="mw-heading mw-heading3"><h3 id="Enregistrements_polymorphes">Enregistrements polymorphes</h3></div>
<p>Il est toutefois possible de définir une fonction qui peut s'appliquer à chacun des enregistrements précédents grâce au concept d'enregistrement polymorphe:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">aireDe</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="n">forall</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">aire</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Number</span>
<span class="nf">aireDe</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">_</span><span class="o">.</span><span class="n">aire</span>
</pre></div>
<p>où le type de l'argument peut se lire comme "le type de tout enregistrement qui possède une étiquette `aire` de type `Number`, et qui possède éventuellement d'autre(s) étiquette(s)". L'argument de cette fonction est donc un enregistrement polymorphe et le compilateur aurait inféré
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">aireDe</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="n">forall</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">.</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">aire</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="n">a</span>
</pre></div>
<p>si l'annotation n'avait pas été précisée.
</p>
<div class="mw-heading mw-heading3"><h3 id="Extensibilité_des_prototypes"><span id="Extensibilit.C3.A9_des_prototypes"></span>Extensibilité des prototypes</h3></div>
<p>En réalité, la notation { étiquette1&nbsp;:: Type1, étiquette2&nbsp;:: Type2 } n'est qu'un <a href="Sucre_syntaxique" title="Sucre syntaxique">sucre syntaxique</a> d'une construction plus générale qui facilite l'extension des types d'<a href="Type_alg%C3%A9brique_de_donn%C3%A9es#Type_produit" title="Type algébrique de données">enregistrements</a>, <code>Record</code> en PureScript (l'extension des <a href="Type_alg%C3%A9brique_de_donn%C3%A9es#Type_somme" title="Type algébrique de données">unions disjointes étiquetées</a><sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup> est similaire). Cette construction est réalisée à partir de déclarations, de juxtapositions et d'applications de prototypes (<code>Row</code>):
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">-- Prototypes (syntaxe commune aux enregistrements et aux variants):</span>
<span class="kr">type</span><span class="w"> </span><span class="kt">NonConcrétisableA</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">aire</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="p">)</span>
<span class="kr">type</span><span class="w"> </span><span class="kt">NonConcrétisableBC</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">boîte</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Boolean</span><span class="p">,</span><span class="w"> </span><span class="n">côté</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="p">)</span>
<span class="kr">type</span><span class="w"> </span><span class="kt">NonConcrétisableABC</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">NonConcrétisableA</span><span class="w"> </span><span class="p">(</span><span class="kt">NonConcrétisableBC</span><span class="w"> </span><span class="n">r</span><span class="p">)</span>
</pre></div>
<p>Il n'est pas directement possible de créer des valeurs correspondant à ces prototypes (<code>Row Type</code> et <code>Type</code> ne sont pas dans la même <a href="Th%C3%A9orie_des_cat%C3%A9gories" title="Théorie des catégories">catégorie</a>). Pour ce faire, on utilise le constructeur <code>Record</code>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">-- Type concret et ouvert (= paramétré):</span>
<span class="kr">type</span><span class="w"> </span><span class="kt">Enregistrement</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">Record</span><span class="w"> </span><span class="p">(</span><span class="kt">NonConcrétisableABC</span><span class="w"> </span><span class="n">r</span><span class="p">)</span>
</pre></div>
<p>Des valeurs peuvent alors peupler ce type:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">-- Type concret et fermé (= non-paramétré):</span>
<span class="nf">carré</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Enregistrement</span><span class="w"> </span><span class="nb">()</span>
<span class="nf">carré</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">côté</span><span class="kt">:</span><span class="w"> </span><span class="mf">2.0</span>
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">aire</span><span class="kt">:</span><span class="w"> </span><span class="mf">4.0</span>
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">boîte</span><span class="kt">:</span><span class="w"> </span><span class="n">false</span><span class="w"> </span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>ou une de ses extensions:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">-- Type concret, étendu et fermé:</span>
<span class="nf">cube</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Enregistrement</span><span class="w"> </span><span class="p">(</span><span class="n">volume</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Number</span><span class="p">)</span>
<span class="nf">cube</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">côté</span><span class="kt">:</span><span class="w"> </span><span class="mf">2.0</span>
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">aire</span><span class="kt">:</span><span class="w"> </span><span class="mf">24.0</span>
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">volume</span><span class="kt">:</span><span class="w"> </span><span class="mf">8.0</span>
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">boîte</span><span class="kt">:</span><span class="w"> </span><span class="n">true</span><span class="w"> </span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Système_de_types"><span id="Syst.C3.A8me_de_types"></span>Système de types</h3></div>
<p>La similitude assumée entre le système de types d'Haskell et celui de PureScript comporte néanmoins certaines nuances, tant au niveau de la syntaxe (par exemple, le "genre"&nbsp;<a href="https://en.wikipedia.org/wiki/Kind_(type_theory)" class="extiw external" title="en:Kind (type theory)"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;Kind_(type_theory)&nbsp;»">(en)</span></a> <code>*</code> d'Haskell se nomme <code>Type</code> en PureScript), qu'aux niveaux des contraintes liées à sa manipulation (aucune extension n'est nécessaire pour accéder à la programmation au niveau "types" en PureScript) et des applications (la programmation au niveau "types" est nécessaire dans certains cas.)
</p><p>En guise d'illustration sont présentés comparativement ci-après deux programmes PureScript complets qui, tous deux,
</p>
<ul><li>définissent le couplage générique entre deux entiers,</li>
<li>définissent l'égalité entre deux couples d'entiers, et</li>
<li>constatent la non-égalité de deux couples particuliers d'entiers,</li></ul>
<p>mais, tandis que l'un est écrit dans un style de programmtion au niveau "valeurs" (connues au moment de l'exécution du programme), l'autre est écrit dans le style de programmation de niveau "types" (déterminés dès l'étape de compilation du programme) qui s'apparente à la <a href="Programmation_logique" title="Programmation logique">programmation logique</a>.
</p><p>De plus, tandis que le premier programme manipule des entiers (signés) en simple précision (<code>Int</code>), le second
utilise des entiers en <a href="Arithm%C3%A9tique_multipr%C3%A9cision" title="Arithmétique multiprécision">multiprécision</a> (<code>Int</code> également, le contexte permettant la distinction), car l'usage de ce genre d'entiers nécessite la programmation de niveau "types" en PureScript si on se limite aux bibliothèques pré-installées.
</p>
<table class="wikitable centre">
<caption>Deux styles de programmation
</caption>
<tbody><tr>
<th>Code au niveau valeurs</th>
<th>Description au niveau valeurs</th>
<th></th>
<th>Code au niveau types</th>
<th>Description au niveau types
</th></tr>
<tr>
<td width="25%">
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="kr">module</span><span class="w"> </span><span class="nn">Main</span><span class="w"> </span><span class="kr">where</span>
</pre></div>
</td>
<td></td>
<td></td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="kr">module</span><span class="w"> </span><span class="nn">Main</span><span class="w"> </span><span class="kr">where</span>
</pre></div>
</td>
<td>
</td></tr>
<tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="3"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Prelude</span><span class="w"> </span>
<span class="linenos" data-line="4"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">Unit</span>
<span class="linenos" data-line="5"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="o">==</span><span class="p">)</span>
<span class="linenos" data-line="6"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="o">&amp;&amp;</span><span class="p">)</span>
<span class="linenos" data-line="7"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="o">$</span><span class="p">)</span>
<span class="linenos" data-line="8"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="nf">show</span>
<span class="linenos" data-line="9"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="10"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Effect</span><span class="w"> </span>
<span class="linenos" data-line="11"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">Effect</span>
<span class="linenos" data-line="12"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="13"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Effect.Console</span><span class="w"> </span>
<span class="linenos" data-line="14"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nf">log</span>
<span class="linenos" data-line="15"></span><span class="w"> </span><span class="p">)</span>
</pre></div>
</td>
<td>l.5: comparaison d'entiers incluse</td>
<td></td>
<td><div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="3"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Prelude</span><span class="w"> </span>
<span class="linenos" data-line="4"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">Unit</span>
<span class="linenos" data-line="5"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="o">$</span><span class="p">)</span>
<span class="linenos" data-line="6"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="7"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Data.Symbol</span><span class="w"> </span>
<span class="linenos" data-line="8"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nf">reflectSymbol</span>
<span class="linenos" data-line="9"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="nf">class</span><span class="w"> </span><span class="kt">IsSymbol</span>
<span class="linenos" data-line="10"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="11"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Effect</span><span class="w"> </span>
<span class="linenos" data-line="12"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">Effect</span>
<span class="linenos" data-line="13"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="14"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Effect.Console</span><span class="w"> </span>
<span class="linenos" data-line="15"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nf">log</span>
<span class="linenos" data-line="16"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="17"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Prim.Boolean</span><span class="w"> </span>
<span class="linenos" data-line="18"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">True</span>
<span class="linenos" data-line="19"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="kt">False</span>
<span class="linenos" data-line="20"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="21"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Prim.Int</span><span class="w"> </span>
<span class="linenos" data-line="22"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nf">class</span><span class="w"> </span><span class="kt">Compare</span>
<span class="linenos" data-line="23"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="24"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Prim.Ordering</span><span class="w"> </span>
<span class="linenos" data-line="25"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">Ordering</span>
<span class="linenos" data-line="26"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="kt">EQ</span>
<span class="linenos" data-line="27"></span><span class="w"> </span><span class="p">)</span>
<span class="linenos" data-line="28"></span><span class="kr">import</span><span class="w"> </span><span class="nn">Type.Prelude</span><span class="w"> </span>
<span class="linenos" data-line="29"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">Proxy</span><span class="w"> </span><span class="p">(</span><span class="o">..</span><span class="p">)</span>
<span class="linenos" data-line="30"></span><span class="w"> </span><span class="p">)</span>
</pre></div>
</td>
<td>
<p>l.22&nbsp;: comparaison d'entiers incluse
</p><p>Les éléments de <code>Prim</code> font référence à la programmation de niveau "types".
</p>
</td></tr>
<tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="17"></span><span class="kr">data</span><span class="w"> </span><span class="kt">SimpleCouple</span><span class="w"> </span>
<span class="linenos" data-line="18"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Type</span>
<span class="linenos" data-line="19"></span><span class="kr">data</span><span class="w"> </span><span class="kt">SimpleCouple</span><span class="w"> </span>
<span class="linenos" data-line="20"></span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">S</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="kt">Int</span>
</pre></div>
</td>
<td>l.20: <code>S</code>, le constructeur de type est employé directement pour décrire comment créer une nouvelle valeur possédant le type <code>SimpleCouple</code>
<p><code>Int</code> est ici le type des entiers codés sur 32 bits
</p>
</td>
<td></td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="32"></span><span class="kr">data</span><span class="w"> </span><span class="kt">MultiCouple</span><span class="w"> </span>
<span class="linenos" data-line="33"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Type</span>
<span class="linenos" data-line="34"></span><span class="kr">data</span><span class="w"> </span><span class="kt">MultiCouple</span>
<span class="linenos" data-line="35"></span>
<span class="linenos" data-line="36"></span><span class="nf">foreign</span><span class="w"> </span><span class="kr">import</span><span class="w"> </span><span class="nn">data</span><span class="w"> </span><span class="kt">M</span><span class="w"> </span>
<span class="linenos" data-line="37"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span>
<span class="linenos" data-line="38"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span>
<span class="linenos" data-line="39"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">MultiCouple</span>
</pre></div>
</td>
<td>
<p>l.36: <code>M</code>, le constructeur de type est indirectement décrit et aucun moyen pour construire une valeur de type <code>MultiCouple</code> n'est fourni
</p><p>l.37 et 38: <code>Int</code> est ici le type des entiers en précision arbitraire
</p>
</td></tr>

<tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="22"></span><span class="kr">class</span><span class="w"> </span><span class="kt">EgalitéV</span><span class="w"> </span>
<span class="linenos" data-line="23"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Type</span><span class="w"> </span>
<span class="linenos" data-line="24"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Constraint</span>
<span class="linenos" data-line="25"></span><span class="kr">class</span><span class="w"> </span><span class="kt">EgalitéV</span><span class="w"> </span><span class="n">v</span><span class="w"> </span>
<span class="linenos" data-line="26"></span><span class="w"> </span><span class="kr">where</span>
<span class="linenos" data-line="27"></span><span class="w"> </span><span class="n">égalitéV</span><span class="w"> </span>
<span class="linenos" data-line="28"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="n">v</span><span class="w"> </span>
<span class="linenos" data-line="29"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="n">v</span><span class="w"> </span>
<span class="linenos" data-line="30"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Boolean</span>
</pre></div>
</td>
<td>
<p>l.22: la logique de ce programme tient entre les lignes 36 et 40; la classe, ici, est facultative et ne serait utile que si d'autres types possédaient la propriété <code>EgalitéV</code>
</p><p>l.30: <code>Boolean</code> est le booléen des valeurs, ses habitants sont <code>true</code> et <code>false</code>
</p>
</td>
<td></td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="41"></span><span class="kr">class</span><span class="w"> </span><span class="kt">EgalitéT</span><span class="w"> </span>
<span class="linenos" data-line="42"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">MultiCouple</span><span class="w"> </span>
<span class="linenos" data-line="43"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">MultiCouple</span><span class="w"> </span>
<span class="linenos" data-line="44"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Boolean</span><span class="w"> </span>
<span class="linenos" data-line="45"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Constraint</span>
<span class="linenos" data-line="46"></span><span class="kr">class</span><span class="w"> </span><span class="kt">EgalitéT</span><span class="w"> </span><span class="n">m1</span><span class="w"> </span><span class="n">m2</span><span class="w"> </span><span class="n">b</span><span class="w"> </span>
<span class="linenos" data-line="47"></span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">m1</span><span class="w"> </span><span class="n">m2</span><span class="w"> </span>
<span class="linenos" data-line="48"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="n">b</span>
<span class="linenos" data-line="49"></span>
<span class="linenos" data-line="50"></span><span class="kr">class</span><span class="w"> </span><span class="kt">Subordonnée</span><span class="w"> </span>
<span class="linenos" data-line="51"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Ordering</span><span class="w"> </span>
<span class="linenos" data-line="52"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Ordering</span><span class="w"> </span>
<span class="linenos" data-line="53"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Boolean</span><span class="w"> </span>
<span class="linenos" data-line="54"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Constraint</span>
<span class="linenos" data-line="55"></span><span class="kr">class</span><span class="w"> </span><span class="kt">Subordonnée</span><span class="w"> </span>
<span class="linenos" data-line="56"></span><span class="w"> </span><span class="n">compart</span><span class="w"> </span>
<span class="linenos" data-line="57"></span><span class="w"> </span><span class="n">comparu</span><span class="w"> </span>
<span class="linenos" data-line="58"></span><span class="w"> </span><span class="n">résultat</span><span class="w"> </span>
<span class="linenos" data-line="59"></span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">compart</span><span class="w"> </span><span class="n">comparu</span><span class="w"> </span>
<span class="linenos" data-line="60"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="n">résultat</span>
</pre></div>
</td>
<td>
<p>l.41 à 48: première étape essentielle de la mise en place de la logique du programme, cette partie fait état des entrées (<code>m1</code> et <code>m2</code>) et sortie (<code>b</code>) du comportement fonctionnel que l'on implémente
</p><p>l.44 et 53: <code>Boolean</code> est le booléen des types, ses habitants sont <code>True</code> et <code>False</code>
</p>
</td></tr>
<tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="32"></span><span class="kr">instance</span><span class="w"> </span>
<span class="linenos" data-line="33"></span><span class="w"> </span><span class="kt">EgalitéV</span><span class="w"> </span>
<span class="linenos" data-line="34"></span><span class="w"> </span><span class="kt">SimpleCouple</span><span class="w"> </span>
<span class="linenos" data-line="35"></span><span class="w"> </span><span class="kr">where</span>
<span class="linenos" data-line="36"></span><span class="w"> </span><span class="n">égalitéV</span><span class="w"> </span>
<span class="linenos" data-line="37"></span><span class="w"> </span><span class="p">(</span><span class="kt">S</span><span class="w"> </span><span class="n">v1</span><span class="w"> </span><span class="n">w1</span><span class="p">)</span><span class="w"> </span>
<span class="linenos" data-line="38"></span><span class="w"> </span><span class="p">(</span><span class="kt">S</span><span class="w"> </span><span class="n">v2</span><span class="w"> </span><span class="n">w2</span><span class="p">)</span><span class="w"> </span>
<span class="linenos" data-line="39"></span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">v1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">v2</span><span class="w"> </span>
<span class="linenos" data-line="40"></span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">w1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">w2</span>
</pre></div>
</td>
<td>
</td>
<td></td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="62"></span><span class="kr">instance</span><span class="w"> </span>
<span class="linenos" data-line="63"></span><span class="w"> </span><span class="kt">Subordonnée</span><span class="w"> </span>
<span class="linenos" data-line="64"></span><span class="w"> </span><span class="kt">EQ</span><span class="w"> </span>
<span class="linenos" data-line="65"></span><span class="w"> </span><span class="kt">EQ</span><span class="w"> </span>
<span class="linenos" data-line="66"></span><span class="w"> </span><span class="kt">True</span>
<span class="linenos" data-line="67"></span><span class="kr">else</span><span class="w"> </span>
<span class="linenos" data-line="68"></span><span class="w"> </span><span class="kr">instance</span><span class="w"> </span>
<span class="linenos" data-line="69"></span><span class="w"> </span><span class="kt">Subordonnée</span><span class="w"> </span>
<span class="linenos" data-line="70"></span><span class="w"> </span><span class="n">c1</span><span class="w"> </span>
<span class="linenos" data-line="71"></span><span class="w"> </span><span class="n">c2</span><span class="w"> </span>
<span class="linenos" data-line="72"></span><span class="w"> </span><span class="kt">False</span>
<span class="linenos" data-line="73"></span>
<span class="linenos" data-line="74"></span><span class="kr">instance</span><span class="w"> </span>
<span class="linenos" data-line="75"></span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">Compare</span><span class="w"> </span>
<span class="linenos" data-line="76"></span><span class="w"> </span><span class="n">t1</span><span class="w"> </span>
<span class="linenos" data-line="77"></span><span class="w"> </span><span class="n">t2</span><span class="w"> </span>
<span class="linenos" data-line="78"></span><span class="w"> </span><span class="n">compart</span>
<span class="linenos" data-line="79"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="kt">Compare</span><span class="w"> </span>
<span class="linenos" data-line="80"></span><span class="w"> </span><span class="n">u1</span><span class="w"> </span>
<span class="linenos" data-line="81"></span><span class="w"> </span><span class="n">u2</span><span class="w"> </span>
<span class="linenos" data-line="82"></span><span class="w"> </span><span class="n">comparu</span>
<span class="linenos" data-line="83"></span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="kt">Subordonnée</span><span class="w"> </span>
<span class="linenos" data-line="84"></span><span class="w"> </span><span class="n">compart</span><span class="w"> </span>
<span class="linenos" data-line="85"></span><span class="w"> </span><span class="n">comparu</span><span class="w"> </span>
<span class="linenos" data-line="86"></span><span class="w"> </span><span class="n">résultat</span>
<span class="linenos" data-line="87"></span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="ow">=&gt;</span><span class="w"> </span>
<span class="linenos" data-line="88"></span><span class="w"> </span><span class="kt">EgalitéT</span><span class="w"> </span>
<span class="linenos" data-line="89"></span><span class="w"> </span><span class="p">(</span><span class="kt">M</span><span class="w"> </span><span class="n">t1</span><span class="w"> </span><span class="n">u1</span><span class="p">)</span><span class="w"> </span>
<span class="linenos" data-line="90"></span><span class="w"> </span><span class="p">(</span><span class="kt">M</span><span class="w"> </span><span class="n">t2</span><span class="w"> </span><span class="n">u2</span><span class="p">)</span><span class="w"> </span>
<span class="linenos" data-line="91"></span><span class="w"> </span><span class="n">résultat</span>
</pre></div>
</td>
<td>
<p>l.74 à 91: cette seconde étape constitue le cœur du problème et est résolu durant la phase de compilation
</p>
</td></tr>

<tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="42"></span><span class="nf">rendu</span><span class="w"> </span>
<span class="linenos" data-line="43"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Boolean</span><span class="w"> </span>
<span class="linenos" data-line="44"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">String</span>
<span class="linenos" data-line="45"></span><span class="nf">rendu</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">show</span>
</pre></div>
</td>
<td>
<p><br>
</p>
</td>
<td></td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="93"></span><span class="kr">class</span><span class="w"> </span><span class="kt">Symbolise</span><span class="w"> </span>
<span class="linenos" data-line="94"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Boolean</span><span class="w"> </span>
<span class="linenos" data-line="95"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Symbol</span><span class="w"> </span>
<span class="linenos" data-line="96"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Constraint</span>
<span class="linenos" data-line="97"></span><span class="kr">class</span><span class="w"> </span><span class="kt">Symbolise</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">s</span><span class="w"> </span>
<span class="linenos" data-line="98"></span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="n">s</span>
<span class="linenos" data-line="99"></span><span class="kr">instance</span><span class="w"> </span>
<span class="linenos" data-line="100"></span><span class="w"> </span><span class="kt">Symbolise</span><span class="w"> </span>
<span class="linenos" data-line="101"></span><span class="w"> </span><span class="kt">True</span><span class="w"> </span>
<span class="linenos" data-line="102"></span><span class="w"> </span><span class="s">"True"</span>
<span class="linenos" data-line="103"></span><span class="kr">instance</span><span class="w"> </span>
<span class="linenos" data-line="104"></span><span class="w"> </span><span class="kt">Symbolise</span><span class="w"> </span>
<span class="linenos" data-line="105"></span><span class="w"> </span><span class="kt">False</span><span class="w"> </span>
<span class="linenos" data-line="106"></span><span class="w"> </span><span class="s">"False"</span>
<span class="linenos" data-line="107"></span>
<span class="linenos" data-line="108"></span><span class="nf">rendu</span><span class="w"> </span>
<span class="linenos" data-line="109"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="n">forall</span><span class="w"> </span><span class="n">s</span>
<span class="linenos" data-line="110"></span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="kt">IsSymbol</span><span class="w"> </span><span class="n">s</span><span class="w"> </span>
<span class="linenos" data-line="111"></span><span class="w"> </span><span class="ow">=&gt;</span><span class="w"> </span><span class="kt">Proxy</span><span class="w"> </span><span class="n">s</span><span class="w"> </span>
<span class="linenos" data-line="112"></span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">String</span>
<span class="linenos" data-line="113"></span><span class="nf">rendu</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">reflectSymbol</span>
</pre></div>
</td>
<td>
<p>l.97 à 106: fonctionnalité auxiliaire permettant ultérieurement d'utiliser la fonction <code>reflectSymbol</code>
</p>
</td></tr>

<tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="47"></span><span class="nf">aprèsExécution</span><span class="w"> </span>
<span class="linenos" data-line="48"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Boolean</span>
<span class="linenos" data-line="49"></span><span class="nf">aprèsExécution</span><span class="w"> </span>
<span class="linenos" data-line="50"></span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">égalitéV</span><span class="w"> </span>
<span class="linenos" data-line="51"></span><span class="w"> </span><span class="p">(</span><span class="kt">S</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span><span class="w"> </span>
<span class="linenos" data-line="52"></span><span class="w"> </span><span class="p">(</span><span class="kt">S</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">6</span><span class="p">)</span>
</pre></div>
</td>
<td>
<p>l.51 et 52: 3, 4, 5 et 6 sont considérés en simple précision
</p>
</td>
<td></td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="115"></span><span class="nf">aprèsCompilation</span><span class="w"> </span>
<span class="linenos" data-line="116"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="n">forall</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">s</span>
<span class="linenos" data-line="117"></span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="kt">EgalitéT</span><span class="w"> </span>
<span class="linenos" data-line="118"></span><span class="w"> </span><span class="p">(</span><span class="kt">M</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span><span class="w"> </span>
<span class="linenos" data-line="119"></span><span class="w"> </span><span class="p">(</span><span class="kt">M</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">6</span><span class="p">)</span><span class="w"> </span>
<span class="linenos" data-line="120"></span><span class="w"> </span><span class="n">b</span>
<span class="linenos" data-line="121"></span><span class="w"> </span><span class="ow">=&gt;</span><span class="w"> </span><span class="kt">Symbolise</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">s</span>
<span class="linenos" data-line="122"></span><span class="w"> </span><span class="ow">=&gt;</span><span class="w"> </span><span class="kt">Proxy</span><span class="w"> </span><span class="n">s</span><span class="w"> </span>
<span class="linenos" data-line="123"></span><span class="nf">aprèsCompilation</span><span class="w"> </span>
<span class="linenos" data-line="124"></span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">Proxy</span>
</pre></div>
</td>
<td>
<p>l.118 et 119: 3, 4, 5 et 6 sont considérés en multiprécision
</p><p>l.122: derrière le type <code>Proxy s</code> se cache le résultat de la résolution du problème
</p><p>l.124: c'est l'identifiant <code>Proxy</code> qui a été choisi pour représenter toute valeur de type <code>Proxy s</code> pour tout <code>s</code>
</p>
</td></tr>
<tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="54"></span><span class="nf">main</span><span class="w"> </span>
<span class="linenos" data-line="55"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Effect</span><span class="w"> </span><span class="kt">Unit</span>
<span class="linenos" data-line="56"></span><span class="nf">main</span><span class="w"> </span>
<span class="linenos" data-line="57"></span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">log</span><span class="w"> </span>
<span class="linenos" data-line="58"></span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">rendu</span><span class="w"> </span>
<span class="linenos" data-line="59"></span><span class="w"> </span><span class="n">aprèsExécution</span>
</pre></div>
</td>
<td>
</td>
<td></td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="126"></span><span class="nf">main</span><span class="w"> </span>
<span class="linenos" data-line="127"></span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Effect</span><span class="w"> </span><span class="kt">Unit</span>
<span class="linenos" data-line="128"></span><span class="nf">main</span><span class="w"> </span>
<span class="linenos" data-line="129"></span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">log</span><span class="w"> </span>
<span class="linenos" data-line="130"></span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">rendu</span><span class="w"> </span>
<span class="linenos" data-line="131"></span><span class="w"> </span><span class="n">aprèsCompilation</span>
</pre></div>
</td>
<td>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<ul><li><a href="Elm_(langage)" title="Elm (langage)">Elm</a></li>
<li><a href="TypeScript" title="TypeScript">TypeScript</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Notes_et_références"><span id="Notes_et_r.C3.A9f.C3.A9rences"></span>Notes et références</h2></div>
<div class="references-small decimal" style=""><div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-wikidata-611c4fdf413f9c91c7b9c14257205dbbc7c6d2ef-1"><span class="mw-cite-backlink"><a href="#cite_ref-wikidata-611c4fdf413f9c91c7b9c14257205dbbc7c6d2ef_1-0">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://github.com/purescript/purescript/releases/tag/v0.15.15"><cite style="font-style:normal;"><span class="lang-en" lang="en">Release 0.15.15</span></cite></a>&nbsp;», <time class="nowrap" datetime="2024-02-07" data-sort-value="2024-02-07">7 février 2024</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2024-02-20" data-sort-value="2024-02-20">20 février 2024</time>)</small></span></span>
</li>
<li id="cite_note-license-2"><span class="mw-cite-backlink"><a href="#cite_ref-license_2-0">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://github.com/purescript/purescript/blob/master/LICENSE"><cite style="font-style:normal;">purescript/purescript</cite></a>&nbsp;», sur <span class="italique">GitHub</span></span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://www.haskell.org/hugs/pages/hugsman/exts.html#sect7.2.2"><cite style="font-style:normal;">Hugs documentation</cite></a>&nbsp;», sur <span class="italique">www.haskell.org</span></span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://leanpub.com/purescript/read#leanpub-auto-about-the-author"><cite style="font-style:normal;">Read PureScript by Example | Leanpub</cite></a>&nbsp;», sur <span class="italique">leanpub.com</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2019-03-14" data-sort-value="2019-03-14">14 mars 2019</time>)</small></span></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://github.com/purescript/purescript"><cite style="font-style:normal;">PureScript on Github</cite></a>&nbsp;»</span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://github.com/purescript-contrib/pulp"><cite style="font-style:normal;">Pulp</cite></a>&nbsp;», PureScript Contrib <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2019-03-14" data-sort-value="2019-03-14">14 mars 2019</time>)</small></span></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://pursuit.purescript.org/"><cite style="font-style:normal;">Pursuit</cite></a>&nbsp;», sur <span class="italique">pursuit.purescript.org</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2019-03-14" data-sort-value="2019-03-14">14 mars 2019</time>)</small></span></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2019">«&nbsp;<a rel="nofollow" class="external text" href="https://github.com/spacchetti/spago"><cite style="font-style:normal;">🍝 PureScript package manager and build tool powered by Dhall and package-sets: spacchetti/spago</cite></a>&nbsp;», spacchetti,‎ <time class="nowrap" datetime="2019-03-14" data-sort-value="2019-03-14">14 mars 2019</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2019-03-14" data-sort-value="2019-03-14">14 mars 2019</time>)</small></span></span>
</li>
<li id="cite_note-docu-9"><span class="reference-text"><span class="ouvrage" id="2019">«&nbsp;<a rel="nofollow" class="external text" href="https://github.com/purescript/documentation"><cite style="font-style:normal;">Documentation for the PureScript language, compiler, and tools.: purescript/documentation</cite></a>&nbsp;», PureScript, <time class="nowrap" datetime="2019-03-14" data-sort-value="2019-03-14">14 mars 2019</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2019-03-14" data-sort-value="2019-03-14">14 mars 2019</time>)</small></span></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><a href="#cite_ref-10">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2019">«&nbsp;<a rel="nofollow" class="external text" href="https://github.com/purescript/purescript/tree/dfbd19da85c92d82ed4c3184f950f74da5332e3f/psc-ide"><cite style="font-style:normal;">purs ide: Editor and tooling support for the PureScript programming language</cite></a>&nbsp;», <time class="nowrap" datetime="2019-04-21" data-sort-value="2019-04-21">21 avril 2019</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2019-04-21" data-sort-value="2019-04-21">21 avril 2019</time>)</small></span></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><a href="#cite_ref-11">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://wiki.haskell.org/Extensible_record"><cite style="font-style:normal;">Extensible record</cite></a>&nbsp;», sur <span class="italique">wiki.haskell.org</span></span></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><a href="#cite_ref-12">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2019">«&nbsp;<a rel="nofollow" class="external text" href="https://pursuit.purescript.org/packages/purescript-variant"><cite style="font-style:normal;"><code>Variant</code></cite></a>&nbsp;», <time class="nowrap" datetime="2019-04-21" data-sort-value="2019-04-21">21 avril 2019</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2019-04-21" data-sort-value="2019-04-21">21 avril 2019</time>)</small></span></span>
</li>
</ol></div>
</div>
<div class="mw-heading mw-heading2"><h2 id="Liens_externes">Liens externes</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.purescript.org">www.purescript.org</a></li></ul>
<div class="navbox-container" style="clear:both;">

</div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2024-06-24" href="https://fr.wikipedia.org/wiki/?title=PureScript&amp;oldid=216234309">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>